import java.util.Scanner;

public class main {
    public int[] FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        /*
        思路：数组中的元素先依次异或，相同为0，则得到的是两个只出现一次的数的异或结果
        （因为其他数都是成对出现，所以在异或过程中抵消了）对于得到的异或结果，找到其第
        一个为1的位，找到后就可以根据这个位，将两个不同的数分到两个不同的数组，这就找到了。

        该位为1，说明两个只出现一次的数该位不同，所以按照该位是0还是1将数组分成两部分
        这样，而两个只出现一次的数正好被分开，再各自异或可得结果。
        */
        int result=0;
        if(array==null||array.length<2)
            return new int[]{result};

        for(int num:array) //数组中的元素先依次异或，相同为0，则得到的是两个只出现一次的数的异或结果
            result ^= num; //因为数组中其他的数都是成对出现，在异或过程中抵消了，而相同的数异或为0,0跟其他数异或为其他数

        //找到两个不相同的数的异或结果result中第一个为1的位，即找到index的位置，因为在这个位置两个数不同【因为“相同为0，相异为1”，而该位为1，说明两个只出现一次的数该位不同，所以按照该位是0还是1将数组分成两部分】
        int index=0;
        for(;index<32;index++){
            if(((result>>index) & 1)==1)			//一开始右移0位，然后右移1位，一位一位的找
                break;
        }

        //num1,num2分别为长度为1的数组。分别用来保存两个不同的数，作为返回结果。
        //将num1[0],num2[0]设置为返回结果
        int[] res = new int[2];
         /*按照该位是0还是1将数组分成两部分,分别异或，由于两个出现一次的数在index位上不一样，则可以根据该位将
         这两个不同的数放在两个不同的数组上，而由于除这两个数之外的数都是成对出现，在异或过程中被抵消了，所以
         不用管其他的数。
         */
        for(int num:array){
            if(((num>>index)&1)==1)
                res[0] ^= num;
            else
                res[1] ^= num;
        }
        return res;
    }
    public static void main(String[] args) {


    }
}
